package cn.tedu.charging.order.service.impl;

import cn.tedu.charging.common.pojo.JsonResult;
import cn.tedu.charging.common.pojo.vo.UserInfoVO;
import cn.tedu.charging.order.pojo.param.OrderAddParam;
import cn.tedu.charging.order.service.OrderService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.HttpMethod;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import java.util.Random;

@Slf4j
@Service
public class OrderServiceImpl implements OrderService {
    @Override
    public String createOrder(OrderAddParam orderAddParam) {
        log.debug("创建订单:{}",orderAddParam);
        //生成订单号
        log.debug("创建订单-生成订单号");
        String orderNo = getOrderNo();
        log.debug("创建订单-生成订单号:{}",orderNo);
        //2.获取 用户信息 （车辆id）
        Integer userId = orderAddParam.getUserId();
        log.debug("创建订单-获取用户信息-入参：{}",userId);
        UserInfoVO userInfo = getUserInfo(userId);
        log.debug("创建订单-获取用户信息-入参:{},出参:{}",userId,userInfo);

        return orderNo;
    }

    /**
     * 生成订单号 满足以下
     *  * 全局唯一性：不能出现重复的ID号，既然是唯一标识，这是最基本的要求。
     *  * 趋势递增：在MySQL InnoDB引擎中使用的是聚集索引，由于多数RDBMS使用B-tree的数据结构来存储索引数据，在主键的选择上面我们应该尽量使用有序的主键保证写入性能。
     *  * 单调递增：保证下一个ID一定大于上一个ID，例如事务版本号、IM增量消息、排序等特殊需求。
     *  * 信息安全：如果ID是连续的，恶意用户的扒取工作就非常容易做了，直接按照顺序下载指定URL即可；如果是订单号就更危险了，竞对可以直接知道我们一天的单量。所以在一些应用场景下，会需要ID无规则、不规则。
     * @return
     */

    private String getOrderNo(){
        //1.前缀
        String start = "100000";
        Random random = new Random();
        //2 生成10000 之内的随机数 0-9999
        int r = random.nextInt(10000);
        //3 获取当前的时间戳
        long now = System.currentTimeMillis();
        //逐渐递增的  趋势递增 下一个比上一个订单号一定大
        return start+"_" + now + "_"+r;
    }

    @Autowired
    private RestTemplate restTemplate;

    public UserInfoVO getUserInfo(Integer userId){
        //String url = "http://localhost:7070/user/info/{1}";
            String url = getRandomUrl();
            log.debug("通过用户服务获取用户信息接口地址：{}",url);
        ParameterizedTypeReference<JsonResult<UserInfoVO>> restType = new ParameterizedTypeReference<JsonResult<UserInfoVO>>(){};
        ResponseEntity<JsonResult<UserInfoVO>> exchange = restTemplate.exchange(url, HttpMethod.GET, null, restType,userId);

        JsonResult<UserInfoVO> body = exchange.getBody();
        return body.getData();
    }

    public String getRandomUrl(){
        String url = "http://localhost:7075/user/info/{1}";
        String url1 = "http://localhost:7076/user/info/{1}";
        String url2 = "http://localhost:7077/user/info/{1}";

        String[] urls = new String[]{url,url1,url2};
        Random random = new Random();
        int index = random.nextInt(urls.length);
        return urls[index];

    }
}
